home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Directory; (* V#144 *)⓪ (*$Y+,L-,H+*)⓪ ⓪ (*⓪"13.1.88: TT DrivesOnline & FreeSpace korrigiert.⓪"14.1.88: TT SplitName korrekt, wenn sfx >3 Zeichen⓪"14.4.88: TT DirQuery vollendet immer Suche mit Snext, damit der interne⓪1Directory-Puffer vom GEMDOS wieder freigegeben wird.⓪"26.8.88: TT GetDirEntry neu - muß noch exportiert werden⓪"9.12.88: TT GetCurrentDir schließt path immer mit '\' ab.⓪"1.07.89: TT SplitPath: LINK-Instr. entfernt, da mit $L+ compiliert⓪"7.08.89: TT GetDirEntry kann nun auch Ordner ermitteln⓪"15.8.89: TT Delete liefert endlich 'fNotDeleted', wenn File nicht exist.⓪#5.9.89: TT GetDirEntry mit INTEGER- statt BOOLEAN-Ergebnis⓪#2.2.90: TT StrToDrive liefert 'defaultDrv', wenn ungültiger LW-Buchstabe;⓪/ForceMediaChange implementiert⓪#6.5.90: TT Auch die Split/Concat-Funktionen haben nun REF-Parameter und⓪/legen ggf. vom Parameter eine Kopie an, wenn er identisch⓪/mit einem Ausgabe-Parm ist.⓪"27.5.90: TT ConcatName/Path kommen nun auch mit gleichen Argumenten bei⓪/den REF-Parms klar.⓪"04.7.90: TT Aufspaltung nach 'FileNames'-Modul⓪"20.7.90: TT DrivesOnline: SETs verkehrt⓪"20.9.90: TT SearchFirst liefert -49 statt -33, wenn keine Files.⓪"24.10.90: TT $H+ bei DirQuery⓪"31.01.91: TT SetCurrentDir: Keine Aktion, wenn 'path' leer ist; MakeFullPath⓪/verwendet "fileUpper" statt Strings.Upper⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;⓪ IMPORT Strings, StrConv;⓪ FROM Clock IMPORT Time, Date, UnpackTime, UnpackDate;⓪ FROM MOSConfig IMPORT FileErrMsg;⓪ FROM FileNames IMPORT SplitPath, DriveToStr, StrToDrive;⓪ FROM MOSGlobals IMPORT FileStr, PathStr, DriveStr, NameStr, SfxStr, PfxStr,⓪(OutOfStack, StringOverflow, fNotDeleted, fPathNotFound, fFileNotFound,⓪(fNoMoreFiles, fNoMatchingFiles, Drive, DriveSet;⓪ ⓪ (*⓪ TYPE FileAttr = (readOnlyAttr, hiddenAttr, systemAttr, volLabelAttr,⓪8subdirAttr, archiveAttr);⓪ ⓪(FileAttrSet = SET OF FileAttr;⓪ ⓪(DirEntry = RECORD⓪9name: ARRAY [0..11] OF CHAR;⓪9attr: FileAttrSet;⓪9time: Time;⓪9date: Date;⓪9size: LONGCARD⓪7END;⓪ ⓪(DirQueryProc = PROCEDURE ( DirEntry ): BOOLEAN; (* TRUE: weiter *)⓪ ⓪(Drive = ( defaultDrv, drvA, drvB, drvC, drvD, drvE, drvF, drvG,⓪2drvH, drvI, drvJ, drvK, drvL, drvM, drvN, drvO, drvP);⓪ *)⓪ ⓪ VAR null: CARDINAL;⓪$strok: BOOLEAN;⓪ ⓪ ⓪ (*$C-*)⓪ VAR mydev: CARDINAL;⓪$regsav, oldgetbpb: ARRAY [0..3] OF LONGWORD;⓪$oldmediach, etv_merk: LONGWORD;⓪$fspec: ARRAY [0..5] OF CHAR;⓪ (*$C+*)⓪ PROCEDURE fmed_asm (driveNo: CARDINAL): LONGINT;⓪ (*$C-*)⓪"CONST hdv_bpb = $0472L;⓪(hdv_rw = $0476L;⓪(hdv_mediach = $047EL;⓪(etv_critic = $0404L; (* Hier der etv_critic-Handler für MB *)⓪"BEGIN⓪$ASSEMBLER⓪0move.w -(A3),D0 ; driveNo⓪0movem.l D7/A2-A3,-(A7)⓪0move.w D0,D7⓪ ⓪0clr.l -(SP) ;Super⓪0move.w #$20,-(SP)⓪0trap #$01⓪0move.l D0,2(SP) ;für nächsten Super-Call⓪ ⓪0move.l etv_critic,etv_merk⓪0lea etv_ersetzt(PC),A0⓪0move.l A0,etv_critic⓪ ⓪0move.w D7,mydev⓪0add.b #'A',D7⓪0move.b D7,fspec⓪ ⓪0movem.l hdv_bpb,A0-A3 ;4 Longs verschieben⓪0movem.l A0-A3,oldgetbpb⓪ ⓪ ; Eines von den vier Longs ist überflüssig, das macht aber nichts, die⓪ ; Routine ist immer noch schneller als die von Atari!⓪ ; Jetzt müßten eigentlich XBRA-Verfahren benutzt werden, aber da die⓪ ; Verschiebung sowieso nur temporär ist, sparen wir an Zeit und Platz!⓪ ⓪0lea newgetbpb(PC),A0⓪0move.l A0,hdv_bpb⓪0lea newrwabs(PC),A0⓪0move.l A0,hdv_rw⓪0lea newmediach(PC),A0⓪0move.l A0,hdv_mediach⓪ ⓪0clr.w -(SP)⓪0pea fspec⓪0move.w #$3D,-(SP)⓪0trap #$01⓪0addq.l #$08,SP⓪ ⓪0tst.l D0⓪0bmi.s noclose⓪0move.w D0,-(SP)⓪0move.w #$3E,-(SP)⓪0trap #$01⓪0addq.l #$04,SP⓪ ⓪ noclose move.l D0,D7⓪ ⓪0lea newgetbpb(PC),A0⓪0cmpa.l hdv_bpb,A0⓪0bne.s done⓪0movem.l oldgetbpb,A0-A3⓪0movem.l A0-A3,hdv_bpb⓪ ⓪ done: move.l etv_merk,etv_critic ;Freigabe⓪0trap #$01⓪0addq.l #$06,SP⓪0move.l D7,D0⓪0movem.l (A7)+,D7/A2-A3⓪0move.l D0,(A3)+⓪0rts⓪ ⓪ newgetbpb: move.w mydev,D0⓪0cmp.w $04(SP),D0⓪0bne.s dooldg⓪ ⓪0movem.l oldgetbpb,A0-A3⓪0movem.l A0-A3,hdv_bpb⓪ ⓪ dooldg: movea.l oldgetbpb,A0⓪0jmp (A0)⓪ ⓪ newmediach: move.w mydev,D0⓪0cmp.w $04(SP),D0⓪0bne.s dooldm⓪0moveq #$02,D0⓪0rts⓪ dooldm: movea.l oldmediach,A0⓪0jmp (A0)⓪ ⓪ newrwabs: move.w mydev,D0⓪0cmp.w $0E(SP),D0⓪0bne.s dooldr⓪0moveq #-$0E,D0⓪0rts⓪ ⓪ dooldr: movea.l oldmediach,A0⓪0jmp (A0)⓪ ⓪ etv_ersetzt: move.w $06(SP),D0 ;Hier der neue etv_critic-Treiber⓪0cmp.w mydev,D0 ;Ist der Fehler auf unserem Laufwerk?⓪0beq.s disk_flipped ;Ja, dann abbrechen!⓪0movea.l etv_merk,A0 ;Normale Fehlerabfertigung⓪0jmp (A0)⓪ ⓪ disk_flipped: move.w $04(SP),D0 ;Fehler zurückmelden, Box abfangen!⓪$END⓪"END fmed_asm;⓪ (*$C+*)⓪ ⓪ (*$L+*)⓪ PROCEDURE ForceMediaChange (driveNo: Drive);⓪"VAR err: LONGINT;⓪"BEGIN⓪$IF driveNo = defaultDrv THEN⓪&driveNo:= DefaultDrive ()⓪$END;⓪$err:= fmed_asm (ORD (driveNo) - 1);⓪ (*⓪$IF err = 0L THEN⓪&errCode:= -1⓪$ELSIF err = -33L THEN⓪&IF driveNo IN DrivesOnline () THEN⓪(errCode:= 0⓪&ELSE⓪(errCode:= fInvalidDrive⓪&END⓪$ELSE⓪&errCode:= SHORT (err)⓪$END⓪ *)⓪"END ForceMediaChange;⓪ (*$L-*)⓪ ⓪ ⓪ PROCEDURE fileUpper (VAR s: ARRAY OF CHAR);⓪"(* "Upper" für Dateinamen: berücksichtigt nur die unteren 128 Zeichen *)⓪"VAR n: CARDINAL;⓪"BEGIN⓪$(*⓪$FOR n:= 0 TO HIGH (s) DO⓪&IF s[n]='' THEN RETURN END;⓪&IF s[n]<CHR(128) THEN s[n]:=CAP(s[n]) END⓪$END⓪$*)⓪$ASSEMBLER⓪(MOVE.W -(A3),D1⓪(MOVE.L -(A3),A1⓪(CLR.W D0⓪&luup:⓪(MOVE.B (A1)+,D0⓪(BEQ ende⓪(BMI next⓪(JSR @CAP ;/A2⓪(MOVE.B D0,-1(A1)⓪&next:⓪(DBRA D1,luup⓪&ende:⓪$END⓪"END fileUpper;⓪ ⓪ ⓪ PROCEDURE str0;⓪"BEGIN⓪$ASSEMBLER⓪(; D0: HIGH (s)⓪(; A0: ADR (s)⓪(; D2 erhalten !⓪(MOVE.L (A7)+,A1⓪(⓪(MOVE D0,D1⓪(ADDQ #3,D1⓪(BCLR #0,D1⓪(⓪(; LINK:⓪(PEA (A5)⓪(MOVE.L A7,A5⓪(SUBA.W D1,A7⓪(⓪(CMPA.L A3,A7⓪(BLS E⓪(MOVE.L A7,A2⓪(⓪%L: MOVE.B (A0)+,(A2)+⓪(DBRA D0,L⓪(CLR.B (A2)+⓪(⓪(MOVE.L A7,D0⓪(JMP (A1)⓪%⓪%E: TRAP #6 ; OUT OF STACK⓪(DC.W -10⓪$END⓪"END str0;⓪ ⓪ PROCEDURE str0b;⓪"BEGIN⓪$ASSEMBLER⓪(; D0: HIGH (s)⓪(; A0: ADR (s)⓪(; D2 erhalten !⓪(MOVE.L (A7)+,A1⓪(⓪(MOVE D0,D1⓪(ADDQ #3,D1⓪(BCLR #0,D1⓪(⓪(SUBA.W D1,A7⓪(⓪(CMPA.L A3,A7⓪(BLS E⓪(MOVE.L A7,A2⓪(⓪%L: MOVE.B (A0)+,(A2)+⓪(DBRA D0,L⓪(CLR.B (A2)+⓪(⓪(MOVE.L A7,D0⓪(JMP (A1)⓪%⓪%E: TRAP #6 ; OUT OF STACK⓪(DC.W -10⓪$END⓪"END str0b;⓪ ⓪ PROCEDURE setDta;⓪"BEGIN⓪$ASSEMBLER⓪(; get old DTA⓪(MOVE #$2F,-(A7)⓪(TRAP #1⓪(MOVE.L D0,D3 ; alten DTA merken in D3⓪(; set new DTA⓪(MOVE.L D4,-(A7)⓪(MOVE #$1A,-(A7)⓪(TRAP #1⓪(ADDQ.L #8,A7⓪$END⓪"END setDta;⓪ ⓪ PROCEDURE getDta;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #$2F,-(A7)⓪(TRAP #1⓪(ADDQ.L #2,A7⓪$END⓪"END getDta;⓪ ⓪ PROCEDURE rstDta;⓪"BEGIN⓪$ASSEMBLER⓪(; reset old DTA, erhalte D0 !⓪(MOVE.L D0,-(A7)⓪(MOVE.L D3,-(A7)⓪(MOVE #$1A,-(A7)⓪(TRAP #1⓪(ADDQ.L #6,A7⓪(MOVE.L (A7)+,D0⓪$END⓪"END rstDta;⓪ ⓪ PROCEDURE copyDirEntry;⓪"BEGIN⓪$ASSEMBLER⓪(; Kopiert von DTA nach entry (A1)⓪ ⓪(; name⓪(MOVEQ #5,D0⓪(LEA $1E(A0),A2⓪$L0: MOVE.W (A2)+,(A1)+⓪(DBRA D0,L0⓪(; attr⓪(MOVE.B 21(A0),(A1)+⓪(CLR.B (A1)+⓪(; time⓪(MOVE 22(A0),(A3)+⓪(MOVEM.L A0/A1,-(A7)⓪(JSR UnpackTime⓪(MOVEM.L (A7)+,A0/A1⓪(MOVE.L -6(A3),(A1)+⓪(MOVE.W -(A3),(A1)+⓪(SUBQ.L #4,A3⓪(; date⓪(MOVE 24(A0),(A3)+⓪(MOVEM.L A0/A1,-(A7)⓪(JSR UnpackDate⓪(MOVEM.L (A7)+,A0/A1⓪(MOVE.L -6(A3),(A1)+⓪(MOVE.W -(A3),(A1)+⓪(SUBQ.L #4,A3⓪(; size⓪(MOVE.L 26(A0),(A1)+⓪$END⓪"END copyDirEntry;⓪ ⓪ PROCEDURE GetDTAEntry ( dta: DTA; VAR entry: DirEntry );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),A1⓪(MOVE.L -(A3),A0⓪(JMP copyDirEntry⓪$END⓪"END GetDTAEntry;⓪ ⓪ PROCEDURE MakeFullPath ( VAR filename: ARRAY OF CHAR;⓪9VAR result: INTEGER );⓪"(*$L+*)⓪"VAR oldpath, path: PathStr; dummy: INTEGER; name: NameStr;⓪"BEGIN⓪$fileUpper (filename);⓪$SplitPath (filename, path, name);⓪$GetDefaultPath (oldpath);⓪$SetDefaultPath (path, result);⓪$GetDefaultPath (path);⓪$SetDefaultPath (oldpath, dummy);⓪$IF result >= 0 THEN⓪&Strings.Concat (path, name, filename, strok);⓪$END⓪"END MakeFullPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetFileAttr (REF name: ARRAY OF CHAR; VAR attr: FileAttrSet; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -14(A3),A0⓪(MOVE.W -10(A3),D0⓪(JSR str0⓪(CLR.L -(A7)⓪(MOVE.L D0,-(A7)⓪(MOVE #$43,-(A7)⓪(TRAP #1⓪(MOVE.L -(A3),A1⓪(MOVE.L -(A3),A0⓪(TST.L D0⓪(BMI E⓪(CLR.W (A1)⓪(MOVE.B D0,(A0)⓪%C: SUBQ.L #6,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%E: MOVE D0,(A1)⓪(BRA C⓪$END⓪"END GetFileAttr;⓪ ⓪ PROCEDURE SetFileAttr (REF name: ARRAY OF CHAR; attr: FileAttrSet; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -12(A3),A0⓪(MOVE.W -08(A3),D0⓪(JSR str0⓪(MOVEQ #0,D1⓪(MOVE.B -06(A3),D1⓪(MOVE D1,-(A7)⓪(MOVE #1,-(A7)⓪(MOVE.L D0,-(A7)⓪(MOVE #$43,-(A7)⓪(TRAP #1⓪(MOVE.L -(A3),A1⓪(TST.L D0⓪(BMI E⓪(CLR.W (A1)⓪%C: SUBQ.L #8,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%E: MOVE D0,(A1)⓪(BRA C⓪$END⓪"END SetFileAttr;⓪ ⓪ PROCEDURE Rename (REF oldName, newName: ARRAY OF CHAR; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -10(A3),A0⓪(MOVE.W -06(A3),D0 ; newName⓪(JSR str0⓪(MOVE.L D0,D2⓪(MOVE.L -16(A3),A0⓪(MOVE.W -12(A3),D0 ; oldName⓪(JSR str0b ; kein erneutes LINK⓪(MOVE.L D2,-(A7) ; newName⓪(MOVE.L D0,-(A7) ; oldName⓪(CLR -(A7)⓪(MOVE #$56,-(A7)⓪(TRAP #1⓪(MOVE.L -(A3),A1⓪(TST.L D0⓪(BMI E⓪(CLR.W (A1)⓪%C: SUBA.W #12,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%E: MOVE D0,(A1)⓪(BRA C⓪$END⓪"END Rename;⓪ ⓪ PROCEDURE Delete (REF name: ARRAY OF CHAR; VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -10(A3),A0⓪(MOVE.W -06(A3),D0⓪(JSR str0⓪(MOVE.L D0,-(A7)⓪(MOVE #$41,-(A7)⓪(TRAP #1⓪(MOVE.L -(A3),A1⓪(TST.L D0⓪(BMI E⓪(CLR.W (A1)⓪%C: SUBQ.L #6,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%E: CMPI #fFileNotFound,D0⓪(BEQ F⓪(CMPI #fPathNotFound,D0⓪(BEQ F⓪(MOVE D0,(A1)⓪(BRA C⓪%F: MOVE #fNotDeleted,(A1)⓪(BRA C⓪$END⓪"END Delete;⓪ ⓪ PROCEDURE DirQuery (REF wildName: ARRAY OF CHAR;⓪8select : FileAttrSet;⓪8dirProc : DirQueryProc;⓪4VAR result : INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -20(A3),A0 ;wildName⓪(MOVE.W -16(A3),D0⓪(JSR str0⓪(⓪(MOVEM.L D3/D4,-(A7)⓪(⓪(; DTA anlegen⓪(SUBA.W #44,A7⓪(MOVE.L A7,D4⓪(⓪(MOVEQ #0,D1⓪(MOVE.B -14(A3),D1 ; select⓪(MOVE.W D1,-(A7)⓪(MOVE.L D0,-(A7) ; zuerst D0 sichern⓪(JSR setDta ; dann DTA sichern/umsetzen⓪(MOVE #$4E,-(A7)⓪(TRAP #1 ; FSFIRST⓪(ADDQ.L #8,A7⓪(JSR rstDta ; alten DTA wiederherstellen⓪ ⓪(TST.L D0⓪(BPL again⓪ ⓪(; wenn leeres Dir, dann 'fNoMatchingFiles' liefern.⓪(CMPI #-33,D0 ; file not found ?⓪(BNE ok3⓪(MOVEQ #fNoMatchingFiles,D0⓪&ok3⓪(BRA.W ok2⓪(⓪$again:⓪(MOVE.L -12(A3),D3 ; 'dirProc'-Adr⓪(BEQ.L errP⓪(MOVE.L -08(A3),D4 ; 'dirProc'-Static Link⓪(; Pfadnamen (ohne Dateinamen) auf Eval-Stack⓪(; Achtung: Da der Name nicht kopiert wird, darf 'dirProc' den⓪(; Path-String nicht verändern !⓪(MOVE.L -20(A3),(A3)+⓪(MOVE.W -20(A3),(A3)+⓪(JSR Strings.Length⓪(MOVE -(A3),D0⓪(MOVE.L -20(A3),A0⓪(BEQ agend2⓪&aglupo:⓪(MOVE.B -1(A0,D0.W),D1⓪(CMPI.B #':',D1⓪(BEQ agende⓪(CMPI.B #'\',D1⓪(BEQ agende⓪(SUBQ #1,D0⓪(BNE aglupo⓪(LEA null,A0⓪(BRA agend2⓪&agende:⓪(SUBQ #1,D0⓪&agend2:⓪(MOVE.L A0,(A3)+ ; ADR (path)⓪(MOVE.W D0,(A3)+ ; HIGH (path)⓪ ⓪(; DirEntry auf Eval-Stack laden, DTA ist direkt auf dem Systemstack⓪(; name⓪(MOVEQ #5,D0⓪(LEA $1E(A7),A0⓪$L0: MOVE.W (A0)+,(A3)+⓪(DBRA D0,L0⓪(; attr⓪(MOVE.B 21(A7),(A3)+⓪(CLR.B (A3)+⓪(; time⓪(MOVE 22(A7),(A3)+⓪(JSR UnpackTime⓪(MOVE 24(A7),(A3)+⓪(; date⓪(JSR UnpackDate⓪(; size⓪(MOVE.L 26(A7),(A3)+⓪ ⓪(; call 'dirProc'⓪(MOVE.L D3,A0⓪(MOVE.L D4,D2⓪(JSR (A0)⓪(TST -(A3)⓪(BEQ abort ; Abbruch⓪(⓪(MOVE.L A7,D4⓪(JSR setDta ; DTA sichern/umsetzen⓪(MOVE #$4F,-(A7)⓪(TRAP #1 ; Fsnext⓪(ADDQ.L #2,A7⓪(JSR rstDta ; alten DTA wiederherstellen⓪ ⓪(TST.L D0⓪(BPL again⓪(⓪(CMPI #-49,D0 ; ENMFIL ?⓪(BEQ ok⓪(BRA ok2⓪(⓪&errP:⓪(TRAP #6⓪(DC.W -17⓪(MOVEQ #-1,D0⓪(BRA ok2⓪(⓪&abort:⓪(MOVE.L A7,D4⓪(JSR setDta⓪(MOVE #$4F,-(A7)⓪&ablp:⓪(TRAP #1 ; Fsnext⓪(TST.L D0⓪(BPL ablp ; so lange wiederholen, bis Ende o. Fehler⓪(ADDQ.L #2,A7⓪(JSR rstDta⓪(⓪&ok:⓪(MOVEQ #0,D0⓪&ok2:⓪(MOVE.L -(A3),A0⓪(MOVE D0,(A0)⓪(⓪(SUBA.W #16,A3⓪(ADDA.W #44,A7⓪(MOVEM.L (A7)+,D3/D4⓪(⓪(; UNLK:⓪(UNLK A5⓪$END⓪"END DirQuery;⓪ ⓪ PROCEDURE SetDefaultDrive ( driveNo: Drive );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE -(A3),D0⓪(SUBQ #1,D0⓪(BCS e⓪(MOVE D0,-(A7)⓪(MOVE #$E,-(A7)⓪(TRAP #1⓪(ADDQ.L #4,A7⓪&e:⓪$END⓪"END SetDefaultDrive;⓪ ⓪ PROCEDURE DefaultDrive (): Drive;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #$19,-(A7)⓪(TRAP #1⓪(ADDQ.L #2,A7⓪(ADDQ #1,D0⓪(MOVE D0,(A3)+⓪$END⓪"END DefaultDrive;⓪ ⓪ PROCEDURE GetCurrentDir ( driveNo: Drive; VAR path: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(SUBA.W #128,A7⓪(MOVE.L A7,D0⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L D0,-(A7)⓪(MOVE #$47,-(A7)⓪(CMPA.L A3,A7⓪(BLS serr⓪(TRAP #1⓪(ADDQ.L #6,A7⓪(MOVE.W (A7)+,D1 ; driveNo⓪(MOVE.L (A7)+,A2 ; ADR (path)⓪(MOVE.W (A7)+,D2 ; HIGH(path)⓪(TST.L D0⓪(BPL ok⓪'err:⓪(CLR.B (A2)⓪(BRA ende⓪'serr:⓪(TRAP #6⓪(DC.W OutOfStack-$2000⓪'ok:⓪(MOVE.L A7,A0⓪'l:⓪(MOVE.B (A0)+,(A2)+⓪(DBEQ D2,l⓪(BNE so⓪(MOVE.B #'\',-1(A2)⓪(TST D2⓪(BMI ende⓪(CLR.B (A2)⓪(BRA ende⓪'so:⓪(TRAP #6⓪(DC.W StringOverflow⓪'ende:⓪(ADDA.W #128,A7⓪$END⓪"END GetCurrentDir;⓪ ⓪ PROCEDURE SetCurrentDir ( driveNo: Drive; REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -10(A3),A0 ; ADR (path)⓪(MOVE.W -6(A3),D0⓪(⓪(TST.B (A0) ; path = '' ?⓪(BNE doSet⓪ ⓪(MOVE.L -(A3),A0⓪(CLR.W (A0) ; result:= 0⓪(SUBQ.L #8,A3⓪(RTS⓪ ⓪ doSet MOVE D0,D1⓪(ADDQ #5,D1⓪(BCLR #0,D1⓪(⓪(; LINK:⓪(PEA (A5)⓪(MOVE.L A7,A5⓪(SUBA.W D1,A7⓪(⓪(CMPA.L A3,A7⓪(BLS E⓪(MOVE.L A7,A2⓪(⓪(MOVEM.L D0/A0/A2,-(A7)⓪(⓪(MOVE.W -12(A3),(A3)+ ; driveNo laden⓪(BNE D ; ist nicht default drive⓪(⓪(SUBQ.L #2,A3⓪(MOVE.L A0,(A3)+⓪(MOVE D0,(A3)+⓪(JSR StrToDrive ; driveNo auf A3-Stack⓪(⓪%D: JSR DefaultDrive⓪(MOVE -(A3),-(A7) ; akt. Drive retten⓪(JSR SetDefaultDrive ; gewünschtes Drive setzen⓪(MOVE (A7)+,(A3)+ ; akt. Drive auf A3-Stack⓪(⓪(MOVEM.L (A7)+,D0/A0/A2⓪(⓪%L: MOVE.B (A0)+,(A2)+⓪(DBRA D0,L⓪(CLR.B (A2)+⓪(⓪(MOVE.L A7,-(A7)⓪(MOVE #$3B,-(A7) ; SetDir⓪(TRAP #1⓪(ADDQ.L #6,A7⓪(⓪(MOVE.L D0,-(A7)⓪(JSR SetDefaultDrive⓪(MOVE.L (A7)+,D0⓪(⓪(MOVE.L -(A3),A1⓪(TST.L D0⓪(BMI F⓪(CLR.W (A1)⓪%C: SUBQ.L #8,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%F: MOVE D0,(A1)⓪(BRA C⓪(⓪%E: TRAP #6 ; OUT OF STACK⓪(DC.W -10⓪$END⓪"END SetCurrentDir;⓪ ⓪ PROCEDURE FreeSpace ( driveNo: Drive ): LONGCARD; (* Angabe in Bytes *)⓪"BEGIN⓪$ASSEMBLER⓪(SUBA.W #16,A7⓪(MOVE -(A3),-(A7)⓪(PEA 2(A7)⓪(MOVE #$36,-(A7)⓪(TRAP #1⓪(ADDQ.L #8,A7⓪(MOVEQ #0,D1⓪(TST.L D0⓪(BMI ende⓪(MOVE.L 8(A7),D1 ; bytes per sector⓪(MULU.W 14(A7),D1 ; sectors per cluster⓪(MOVE.L D1,(A3)+⓪(MOVE.L (A7),(A3)+ ; free clusters⓪(JSR @CMUL⓪(MOVE.L -(A3),D1⓪&ende:⓪(ADDA.W #16,A7⓪(MOVE.L D1,(A3)+⓪$END⓪"END FreeSpace;⓪ ⓪ PROCEDURE CreateDir ( REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪ BEGIN⓪$ASSEMBLER⓪(MOVE.L -10(A3),A0⓪(MOVE.W -06(A3),D0⓪(JSR str0⓪(MOVE.L D0,-(A7)⓪(MOVE #$39,-(A7)⓪(TRAP #1⓪(MOVE.L -(A3),A1⓪(TST.L D0⓪(BMI E⓪(CLR.W (A1)⓪%C: SUBQ.L #6,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%E: MOVE D0,(A1)⓪(BRA C⓪$END⓪"END CreateDir;⓪ ⓪ PROCEDURE DeleteDir ( REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪ BEGIN⓪$ASSEMBLER⓪(MOVE.L -10(A3),A0⓪(MOVE.W -06(A3),D0⓪(JSR str0⓪(MOVE.L D0,-(A7)⓪(MOVE #$3A,-(A7)⓪(TRAP #1⓪(MOVE.L -(A3),A1⓪(TST.L D0⓪(BMI E⓪(CLR.W (A1)⓪%C: SUBQ.L #6,A3⓪(; UNLK:⓪(UNLK A5⓪(RTS⓪%E: MOVE D0,(A1)⓪(BRA C⓪$END⓪"END DeleteDir;⓪ ⓪ ⓪ PROCEDURE DrivesOnline (): DriveSet;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #10,-(A7)⓪(TRAP #13⓪(ADDQ.L #2,A7⓪(SWAP D0⓪(CLR D0⓪(SWAP D0⓪(LSL.L #1,D0⓪(MOVE.L D0,(A3)+⓪$END⓪"END DrivesOnline;⓪ ⓪ ⓪ PROCEDURE GetDirEntry ( REF fileName: ARRAY OF CHAR;⓪8VAR entry: DirEntry; VAR res: INTEGER );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -14(A3),A0⓪(MOVE.W -10(A3),D0⓪(JSR str0⓪ ⓪(MOVE.W #$0010,-(A7) ; Attribut: alle Dateien/Ordner⓪(MOVE.L D0,-(A7) ; zuerst D0 (^name) sichern⓪(MOVE #$4E,-(A7)⓪(TRAP #1 ; FSFIRST⓪(ADDQ.L #8,A7⓪ ⓪(MOVE.L -8(A3),A1 ; ADR (entry)⓪ ⓪(; Name in Dir vorhanden ?⓪(TST.L D0⓪(BMI fals⓪ ⓪(; DirEntry kopieren⓪(MOVE.L A1,-(A7)⓪(JSR getDta⓪(MOVE.L D0,A0⓪(MOVE.L (A7)+,A1⓪(JSR copyDirEntry⓪(MOVEQ #0,D0⓪(BRA ende⓪ ⓪&fals⓪(; entry löschen⓪(MOVEQ #14,D1⓪$l1: CLR.W (A1)+⓪(DBRA D1,l1⓪ ⓪&ende⓪(MOVE.L -(A3),A0 ; ok⓪(MOVE D0,(A0)⓪ ⓪(SUBA.W #10,A3 ; name + entry⓪(UNLK A5⓪$END⓪"END GetDirEntry;⓪ ⓪ ⓪ PROCEDURE FileExists ( REF fileName: ARRAY OF CHAR ): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -6(A3),A0⓪(MOVE.W -2(A3),D0⓪(JSR str0⓪(SUBQ.L #6,A3⓪ ⓪(MOVE.L D0,A0⓪(TST.B (A0)⓪(BNE ok⓪ ⓪(CLR D0⓪(BRA ende⓪ ⓪$ok: CLR -(A7) ; Attribut: nur Dateien⓪(MOVE.L D0,-(A7) ; zuerst D0 (^name) sichern⓪(MOVE #$4E,-(A7)⓪(TRAP #1 ; FSFIRST⓪(ADDQ.L #8,A7⓪ ⓪(; Name in Dir vorhanden ?⓪(TST.L D0⓪(SPL D0⓪(ANDI #1,D0⓪&ende:⓪(MOVE D0,(A3)+⓪ ⓪(UNLK A5⓪$END⓪"END FileExists;⓪ ⓪ ⓪ PROCEDURE PathExists ( REF path: ARRAY OF CHAR ): BOOLEAN;⓪!(*⓪"* Hier kann nicht mit Fsfirst gearbeitet werden, weil bestimmte Pfadnamen⓪"* nicht als Root-Dir erkennbar wären (z.B. "..\") und dort Fsfirst nicht⓪"* funktioniert.⓪"*)⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(SUBA.W #66,A7⓪(MOVE.L A7,(A3)+⓪(MOVE #65,(A3)+⓪(JSR GetDefaultPath⓪(SUBA.W #66,A7⓪(MOVE.L A7,(A3)+⓪(MOVE #65,(A3)+⓪(SUBA.W #12,A7⓪(MOVE.L A7,(A3)+⓪(MOVE #11,(A3)+⓪(JSR SplitPath⓪(ADDA.W #12,A7⓪(MOVE.L A7,(A3)+⓪(MOVE #65,(A3)+⓪(SUBQ.L #2,A7⓪(MOVE.L A7,(A3)+⓪(JSR SetDefaultPath⓪(TST (A7)+⓪(SPL D0⓪(ANDI #1,D0⓪(MOVE D0,(A3)+⓪(ADDA.W #66,A7⓪(MOVE.L A7,(A3)+⓪(MOVE #65,(A3)+⓪(SUBQ.L #2,A7⓪(MOVE.L A7,(A3)+⓪(JSR SetDefaultPath⓪(UNLK A5⓪$END⓪"END PathExists;⓪ ⓪ ⓪ PROCEDURE SetDefaultPath ( REF path: ARRAY OF CHAR; VAR result: INTEGER );⓪"(*$L+*)⓪"BEGIN⓪$SetDefaultDrive ( StrToDrive (path) );⓪$SetCurrentDir ( StrToDrive (path), path, result )⓪"END SetDefaultPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE DefaultPath (): PathStr;⓪"(*$L+*)⓪"VAR path: PathStr;⓪"BEGIN⓪$GetDefaultPath (path);⓪$RETURN path⓪"END DefaultPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetDefaultPath ( VAR path: ARRAY OF CHAR );⓪"(*$L+*)⓪"BEGIN⓪$GetCurrentDir (defaultDrv, path);⓪$Strings.Insert (DriveToStr (DefaultDrive ()), 0, path, strok);⓪"END GetDefaultPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetDTA ( VAR dta: DTA );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #$2F,-(A7)⓪(TRAP #1⓪(ADDQ.L #2,A7⓪(MOVE.L -(A3),A0⓪(MOVE.L D0,(A0)⓪$END⓪"END GetDTA;⓪ ⓪ PROCEDURE SetDTA ( dta: DTA );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),-(A7)⓪(MOVE #$1A,-(A7)⓪(TRAP #1⓪(ADDQ.L #6,A7⓪$END⓪"END SetDTA;⓪ ⓪ ⓪ PROCEDURE SearchFirst ( REF wildcard: ARRAY OF CHAR;⓪<select : FileAttrSet;⓪8VAR result : INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -12(A3),A0⓪(MOVE.W -08(A3),D0⓪(JSR str0⓪ ⓪(MOVEQ #0,D1⓪(MOVE.B -06(A3),D1⓪(MOVE.W D1,-(A7)⓪(MOVE.L D0,-(A7) ; zuerst D0 (^name) sichern⓪(MOVE #$4E,-(A7)⓪(TRAP #1 ; FSFIRST⓪(ADDQ.L #8,A7⓪ ⓪(; wenn leeres Dir, dann 'fNoMoreFiles' liefern.⓪(CMPI #-33,D0 ; file not found ?⓪(BNE ok3⓪(MOVEQ #fNoMoreFiles,D0⓪&ok3⓪ ⓪(MOVE.L -(A3),A0 ; ok⓪(MOVE D0,(A0)⓪ ⓪(SUBA.W #6,A3 ; name + attrib⓪(UNLK A5⓪$END⓪"END SearchFirst;⓪ ⓪ PROCEDURE SearchNext ( VAR result: INTEGER);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪ ⓪(MOVE #$4F,-(A7)⓪(TRAP #1 ; FSFIRST⓪(ADDQ.L #2,A7⓪ ⓪(MOVE.L -(A3),A0 ; ok⓪(MOVE D0,(A0)⓪ ⓪(UNLK A5⓪$END⓪"END SearchNext;⓪ ⓪ ⓪ PROCEDURE getSt2 (ad:ADDRESS; n:INTEGER; VAR msg:ARRAY OF CHAR): BOOLEAN;⓪"VAR s: POINTER TO ARRAY [0..31] OF CHAR;⓪"(*$L+*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L ad(A6),A0⓪(MOVE.W n(A6),D0⓪(⓪%l: CMP.W (A0)+,D0⓪(BNE c⓪(⓪(; gefunden⓪(MOVE.L A0,s(A6)⓪(BRA e⓪(⓪%c: TST.B (A0) ; Listenende ?⓪(BEQ f ; Ja, -> nicht gefunden⓪(⓪%m: ADDA.W #32,A0⓪(BRA l⓪(⓪%f: CLR.L s(A6)⓪%e:⓪$END;⓪$IF s#NIL THEN⓪&Strings.Assign (s^,msg, strok);⓪&RETURN TRUE⓪$ELSE⓪&RETURN FALSE⓪$END⓪"END getSt2;⓪"(*$L=*)⓪ ⓪ PROCEDURE GetErrMsg ( n: INTEGER; VAR msg: ARRAY OF CHAR );⓪"VAR p:INTEGER;⓪"(*$L+*)⓪"BEGIN⓪$msg[0]:=0C;⓪$IF FileErrMsg=NIL THEN⓪&Strings.Assign ('Unknown error #@',msg,strok)⓪$ELSE⓪&IF ~getSt2 (FileErrMsg,n,msg) THEN⓪(IF n<0 THEN⓪*IF getSt2 (FileErrMsg,-32768,msg) THEN END⓪(ELSE⓪*IF getSt2 (FileErrMsg,32767,msg) THEN END⓪(END⓪&END;⓪$END;⓪$p:=Strings.Pos ('@',msg,0);⓪$IF p>=0 THEN⓪&Strings.Delete (msg,p,1,strok);⓪&Strings.Insert (StrConv.IntToStr(n,0),p,msg,strok)⓪$END⓪"END GetErrMsg;⓪"(*$L=*)⓪ ⓪ BEGIN⓪"null:= 0;⓪"(*$C-*) fspec:= ' :\\X'; (*$C+*)⓪ END Directory.⓪ ə
- (* $000030D0$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$00005120$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFF21D8C$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFED45E4$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACF$FFFBFACFÇ$00001639T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000016FD$00002074$00004C41$000038DB$0000201C$FFEE7904$00000568$0000054D$FFEE4CC0$FFEE4CC0$00001709$00001655$FFF13E0C$0000165F$0000164C$00001639ÉÇâ*)
-